{
 "cells": [
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "# 实验五：K近邻算法\n",
    "\n",
    "**学号：** 20221202433\n",
    "\n",
    "**姓名：** 罗玉轩\n",
    "\n",
    "## 实验目标\n",
    "\n",
    "1. 在提供的iris数据集上实现使用基于欧式距离的KNN算法\n",
    "2. 要求KNN算法在测试集上达到90%以上的分类准确率\n",
    "3. 选择出最优的K值\n",
    "4. 尝试替换其他距离度量公式\n",
    "5. 对比sklearn的结果"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 1. 导入必要的库"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 19,
   "metadata": {},
   "outputs": [],
   "source": [
    "import numpy as np\n",
    "import pandas as pd\n",
    "import matplotlib.pyplot as plt\n",
    "from sklearn.model_selection import train_test_split\n",
    "from sklearn.preprocessing import StandardScaler\n",
    "from sklearn.neighbors import KNeighborsClassifier\n",
    "from sklearn.metrics import accuracy_score\n",
    "\n",
    "plt.rcParams['font.sans-serif'] = ['SimHei']\n",
    "plt.rcParams['axes.unicode_minus'] = False"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 2. 实现自定义KNN算法\n",
    "\n",
    "我们将实现一个自定义的KNN算法类，支持多种距离度量方式：\n",
    "\n",
    "1. 欧式距离（Euclidean Distance）\n",
    "2. 曼哈顿距离（Manhattan Distance）\n",
    "3. 切比雪夫距离（Chebyshev Distance）\n",
    "4. 闵可夫斯基距离（Minkowski Distance）"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 20,
   "metadata": {},
   "outputs": [],
   "source": [
    "class MyKNN:\n",
    "    def __init__(self, k=5, distance_metric='euclidean'):\n",
    "        self.k = k\n",
    "        self.distance_metric = distance_metric\n",
    "        self.X_train = None\n",
    "        self.y_train = None\n",
    "    \n",
    "    def fit(self, X, y):\n",
    "        self.X_train = X\n",
    "        self.y_train = y\n",
    "        return self\n",
    "    \n",
    "    def euclidean_distance(self, x1, x2):\n",
    "        return np.sqrt(np.sum((x1 - x2) ** 2))\n",
    "    \n",
    "    def manhattan_distance(self, x1, x2):\n",
    "        return np.sum(np.abs(x1 - x2))\n",
    "    \n",
    "    def chebyshev_distance(self, x1, x2):\n",
    "        return np.max(np.abs(x1 - x2))\n",
    "    \n",
    "    def minkowski_distance(self, x1, x2, p=3):\n",
    "        return np.power(np.sum(np.power(np.abs(x1 - x2), p)), 1/p)\n",
    "    \n",
    "    def calculate_distance(self, x1, x2):\n",
    "        if self.distance_metric == 'euclidean':\n",
    "            return self.euclidean_distance(x1, x2)\n",
    "        elif self.distance_metric == 'manhattan':\n",
    "            return self.manhattan_distance(x1, x2)\n",
    "        elif self.distance_metric == 'chebyshev':\n",
    "            return self.chebyshev_distance(x1, x2)\n",
    "        elif self.distance_metric == 'minkowski':\n",
    "            return self.minkowski_distance(x1, x2)\n",
    "        else:\n",
    "            raise ValueError(f\"不支持的距离度量方式: {self.distance_metric}\")\n",
    "    \n",
    "    def predict(self, X):\n",
    "        y_pred = [self._predict(x) for x in X]\n",
    "        return np.array(y_pred)\n",
    "    \n",
    "    def _predict(self, x):\n",
    "        # 计算与所有训练样本的距离\n",
    "        distances = [self.calculate_distance(x, x_train) for x_train in self.X_train]\n",
    "        \n",
    "        # 获取最近的k个样本的索引\n",
    "        k_indices = np.argsort(distances)[:self.k]\n",
    "        \n",
    "        # 获取这k个样本的标签\n",
    "        k_nearest_labels = [self.y_train[i] for i in k_indices]\n",
    "        \n",
    "        # 返回出现最多的标签\n",
    "        most_common = np.bincount(k_nearest_labels).argmax()\n",
    "        return most_common"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 3. 加载和预处理数据"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 21,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "数据集形状: (150, 4)\n",
      "类别分布: [50 50 50]\n"
     ]
    }
   ],
   "source": [
    "# 加载数据集\n",
    "def load_data():\n",
    "    # 读取CSV文件\n",
    "    data = pd.read_csv('src/iris.csv', header=None)\n",
    "    \n",
    "    # 第一行是标题行，需要处理\n",
    "    if data.iloc[0, 0] == 150:\n",
    "        # 如果第一行是标题行，删除它\n",
    "        data = data.iloc[1:].reset_index(drop=True)\n",
    "    \n",
    "    # 分离特征和标签\n",
    "    X = data.iloc[:, :4].values.astype(float)\n",
    "    y = data.iloc[:, 4].values.astype(int)\n",
    "    \n",
    "    return X, y\n",
    "\n",
    "# 加载数据\n",
    "X, y = load_data()\n",
    "\n",
    "# 查看数据集基本信息\n",
    "print(f\"数据集形状: {X.shape}\")\n",
    "print(f\"类别分布: {np.bincount(y)}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 22,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "训练集形状: (105, 4)\n",
      "测试集形状: (45, 4)\n"
     ]
    }
   ],
   "source": [
    "# 划分训练集和测试集\n",
    "X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)\n",
    "\n",
    "# 标准化数据\n",
    "scaler = StandardScaler()\n",
    "X_train_scaled = scaler.fit_transform(X_train)\n",
    "X_test_scaled = scaler.transform(X_test)\n",
    "\n",
    "print(f\"训练集形状: {X_train.shape}\")\n",
    "print(f\"测试集形状: {X_test.shape}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 4. 寻找最优K值\n",
    "\n",
    "我们将测试不同的K值（从1到20），找出在测试集上表现最好的K值。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 23,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "K = 1, 准确率 = 0.9778\n",
      "K = 2, 准确率 = 0.9778\n",
      "K = 3, 准确率 = 1.0000\n",
      "K = 4, 准确率 = 0.9778\n",
      "K = 5, 准确率 = 1.0000\n",
      "K = 6, 准确率 = 1.0000\n",
      "K = 7, 准确率 = 1.0000\n",
      "K = 8, 准确率 = 1.0000\n",
      "K = 9, 准确率 = 1.0000\n",
      "K = 10, 准确率 = 1.0000\n",
      "K = 11, 准确率 = 1.0000\n",
      "K = 12, 准确率 = 1.0000\n",
      "K = 13, 准确率 = 1.0000\n",
      "K = 14, 准确率 = 1.0000\n",
      "K = 15, 准确率 = 1.0000\n",
      "K = 16, 准确率 = 1.0000\n",
      "K = 17, 准确率 = 1.0000\n",
      "K = 18, 准确率 = 0.9778\n",
      "K = 19, 准确率 = 1.0000\n",
      "K = 20, 准确率 = 1.0000\n",
      "\n",
      "最优K值为 3，准确率为 1.0000\n"
     ]
    }
   ],
   "source": [
    "# 测试不同的K值\n",
    "k_values = range(1, 21)\n",
    "accuracies = []\n",
    "\n",
    "for k in k_values:\n",
    "    knn = MyKNN(k=k)\n",
    "    knn.fit(X_train_scaled, y_train)\n",
    "    y_pred = knn.predict(X_test_scaled)\n",
    "    accuracy = accuracy_score(y_test, y_pred)\n",
    "    accuracies.append(accuracy)\n",
    "    print(f\"K = {k}, 准确率 = {accuracy:.4f}\")\n",
    "\n",
    "# 找出最优的K值\n",
    "best_k = k_values[np.argmax(accuracies)]\n",
    "best_accuracy = max(accuracies)\n",
    "print(f\"\\n最优K值为 {best_k}，准确率为 {best_accuracy:.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 24,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAIfCAYAAACCdxb2AAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAAB/O0lEQVR4nO3deZhU1Z3/8U9tvXfTK7KISoxZUNEYMTiJInFXMGZ0NMaYyEjG6OMSNcSoI4hxy4LruCSj0UhcEs0omoBCJtGoP4yjQRRRDNhERdBe6aW6a72/P6rv7W56q+6uqrvU+/U8/WjXeupQHO73nO/5Hp9hGIYAAAAAABnht7sBAAAAAOAlBFkAAAAAkEEEWQAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQCAMWltbVVLS4s6OzvV3d2d1k9bW5s6OjokSdFoNO3nmT/RaHRMbX300Ud1zTXXWO9tOvXUU3XPPfek9Rpvv/32oLevW7du1O2pr6/XaaedpvXr12vLli068sgj9f7774/6dSRp+fLlOv3009Xe3j7q5/7lL3/Rj3/84zG9LwBgaARZAIAxueCCC1RdXa2ysjIVFxen9TNhwgTddNNNkqQjjjgi7eeZPyeddNKY2vqrX/1Kv/vd7+Tz+ZRIJKzbn3zySXV1dVm/J5NJdXd3D3h+Z2en9t13Xz344IP9bo/FYvryl7+syy+/fND3DYfDWrRo0YAA6IknntD//M//qKysTJMnT1Y0GtXxxx+vcDg84DU6Ojr01ltvqb6+Xlu3blV9fb3eeecdhcNhxWIxXX/99SovL1d5efmQnz8ejyscDiuZTPa7/cMPP9SSJUsGBHiJREIdHR0DHg8ASI/PMAzD7kYAANynqalJ0WhUhYWF8vv9/W7/whe+oCVLluicc87p95xYLKaCggJNmDBBc+fOVU1NjX7+85+n9X4XXnihSkpK9Nvf/laS5PP5dMstt+j73/++JOmFF17QEUccocsvv1w33HCD9byPP/5Yu+++u+688049/PDDev7554d9ny9+8Yt69dVX+9326quvavbs2frkk09UXV1t3f7nP/9ZRx11lDZt2qR99tlnwGt9/PHHmjNnjiZNmqRVq1apuLhYyWRSn//85/W5z31OK1assB736KOP6sILL5RhGIpEIiopKZEkPf/88zr++OPl8/kUDodVXl6uWCymF198UatXr9bVV1+tsrIySVJXV5fKysr0j3/8o187n3vuOc2dO1eFhYUqLS2Vz+eTlAq+gsFgvzYbhqGOjg5Fo1HV19drr732Gra/AAADBUd+CAAAA9XU1Ax6+w9/+ENNnDhRF110kUKh0JDPDwQCKisr07Rp05RIJBQKhayL/76i0ahCoZBKS0sHBASmnTt36qyzztLs2bN17bXX9rvv5z//uQoKCnTGGWdo/vz5CgQCCoVCamlp0d57763HH39cRx55pKRUkNJ3pSscDuujjz7SCy+8oH333VfNzc1qbm5WZWWlamtr9etf/1pTpkzR//7v/+p///d/recdffTR2nvvvbXbbrvpf//3f/WVr3xFp556qp588kk99dRTevfdd/Xuu+8O+LxmwCilAtJgMKg5c+YoHA7r/vvv11VXXaWPPvpIkvTyyy/rmmuu0cMPP6zTTjtNyWRS+++/v84555x+AZYkHX744frwww81efJkKyD++9//rhNPPFGPPvqoDjvssH6B8ptvvqkpU6YMeB0AQHpIFwQAZMzq1at177336rjjjhs2wOrrhRdesFbDfD7fgJ/CwkL985//HPY1zjvvPO3cuVMPP/xwv0CsoaFB99xzj/bff3+Vl5dr8uTJmjhxoqqqqqxUuKlTp6qyslKVlZWaPHmydt99d+v5L774ovbZZx9deumleuONN7TPPvton3320c9+9jO1tbXp8ccfV2lpqe69917r56KLLtL69eut15g6dapWrVqlYDCo9vZ2XXXVVZKkO++8Uy0tLWppadGBBx6oyy+/XM3Nzdq+fbvef//9AQHlSy+9pK9+9auSpMbGRp188sm6+OKLddppp0mSfve736m5uVnnn3/+gP6Jx+M67rjjdMwxx+jjjz9We3u7FixYoO985zs6/PDDdckll+j0009XLBbT888/r8MPP1zXXHPNoEEvAGBkrGQBADLigw8+0Le//W0FAgFJqb1E//Zv/6brr79eBx100JDP++IXv6j169cPupJlGIai0aimTJky5POXL1+uRx55RL///e+155579rvvhz/84YBiF1/60pe0YcMGFRcXq6amRvPmzZMktbe36/vf/75+8pOfWI8tLCy02mE66qijVFhYqP/6r/9SWVmZ1q1bZ6X2SdLkyZNVUFDQ7z3N1MArrrhCW7duVWFhoUpKSlRZWSkptapXVFSkCRMmKB6Pa9dM/lgspj/+8Y+66667JEm1tbV64okndM8996i0tFTFxcVqa2tTYWGhdt99d0UiEe25557asGGDJKmgoEDPPfecvv71r+u5557TlVdeKcMwVFRUpHPPPVePPvqonnjiCbW0tOikk07SZZddpquvvnrIPgcADI+VLADAuDU2NurEE0/UrFmzNHfuXElSUVGRSktLNXfuXP31r38d8rnl5eWaOXOmtU+p78/nP/95HXDAAQOCFlN9fb0uuOACnXnmmfrXf/3XfvetXLlSDzzwgPbee+9+txcWFuqKK65QY2Njv5/58+erqKio32PNgHFXDQ0NuvHGG/XjH/+4X4AlpQIiMzjrK5FIaNu2bbrkkktUVlamBQsWWKt1r732mpYuXapAIKDCwkJrtcv0+OOPa8eOHXr44Yf1rW99S9/73vd06KGHqqSkxPoshx9+uO644w41NjbqlltuGdBnNTU1ev7553X66afr4IMP1pFHHqm//vWveuSRR/TMM8/oy1/+siZOnKhXX31VixcvZhULAMaBIAsAMC7vv/++jjjiCJWUlOjhhx+29vYEg0E98sgjOvzww3Xcccfp2WefHfI1Pvjgg0FTBSdPnjzse995551qa2vT66+/PqAS3ksvvaQjjjhC//Ef/9Hvdr/fr6uvvnrAe/3+978fMrDo6OiwfhKJhHbbbTetWLFC++67r+bPn9/vvaPR6IBgrbm5WeFwWL/+9a+1ZMkSq+27pgs2NjZq+/btuvLKK63ndnZ26kc/+pGqqqr0ta99TZ/61KesghnDGSwwfeihh/TTn/5Uv/3tb/X1r39dGzdu1KpVq9TU1KT99ttPra2t+uY3v6kLL7xw0CqLAID0EGQBAMbsueee0yGHHKKqqio9++yzA8qIh0IhPfbYY5o9e7ZOPvlkrV69etDXMVd+XnnlFSvwuO+++zRhwoRh3z8YDOrGG2/UW2+9ZVUdNP34xz/WE0880a+gQ9/7DMPo93PKKacM+T5mifTy8nI999xzkqSvfvWr2muvvbR69Wo99thj1mMHC7J+97vf6V/+5V8kybrPTBesrKy00gVramo0adIkq+CEYRg6++yz1djYqJKSEn3rW9/SMcccY/VXIpHQ9ddfr8rKSj3//PM6//zzVVlZqYsuuqjf+9fX1+uUU07RD37wA33605/WRRddpJNPPlnf+MY39Nxzz+npp5/Wli1bdMkll+gXv/iFVq5caVVTBACMHkEWAGDU4vG4LrzwQh155JE65phj9Kc//WnIgKioqEhPPvmkPve5z+nrX/+6VR2vL3MFqby83Ao8SkpKhkzXM11yySX60Y9+pIMPPljXXnttv8qAfr/f2vO0q2XLlmmvvfbq97Nq1aoh36ehocH6Ofzww63bp06dqtNPP906+8ssv75rkPXYY4/pgAMO6LdSFg6H1draqtbWViUSCXV3d6u5uVmffPKJdu7cafXLN7/5TS1btmzQdnV3d+uqq65Sa2ur5syZo7vuukutra26/fbb+z3u//7v//Thhx/q9ddf17/+679q69at+sY3vqH3339f1113nY488kj99Kc/1f/93/9p+vTpWrt2rc466yzV1dUN2ScAgKFR+AIAMGrBYFDTp0/XvffeqwULFoz4+IqKCv3hD3/QCy+8MGgRCzM4am9vV2trqyRZh+0OZ7fddpMkLVmyRPPnz9fDDz+ss846a8T2XHbZZfrP//zPfredeuqpQz6+trbW+v9dqyYuXLhQc+fO1caNG60zpfru09qyZYv+8pe/aM2aNf2e94Mf/MBKC+zo6NDbb7+tO++8U4lEQhdccIF++tOfSpK+/vWv6+WXXx60Xe3t7frNb36jl19+WevXr1djY6Mef/xxffDBByouLpaUCvxOOOEEzZ8/37rtqaeekiQ9+uijWr16tU4//XSrTWYg+P3vf1/d3d3WcwAA6SPIAgCMyaWXXjqqx0+dOlXf+MY3Br0vEolIkg455JB+t5tB1EjmzZtnrWZ985vfHHEF7Oqrrx60et5+++2X1vv1ddhhh+nvf/+7ZsyYYaXXVVRUWPf/5Cc/0Z577mmVXzfdddddOvvssyVJBx98sObNm6drrrlmyPfZtm2bFQCZVRS3b9+uiy66SOeff76OOuoofetb39LZZ59tlZOXUgcdj7S3bai9aLvttpt27Ngx7HMBAAORLggAyKi+KXvpmjZtWr+UPPNn48aNab/GkiVLtHnzZj344IMD7tu1JPpo92Rt3brV+tm1IITP59MBBxwgSWppaZHUG2TV19frgQce0MKFC9Ou1pdMJhWJRBSNRvvdPnXqVBmGoRdeeEGxWEyRSEQbNmwYtjy+lAqU2tra1N3drWQy2e8zP/LIIyotLR3QF4ZhKB6P67333kurzQCA/giyAAAZFYlEFI/HR/Ucv9+v2traAT9mAQhp5ODNXM267rrr+r1/NBpVJBLRBx98oHfeeUddXV1qbm7W5s2b+/10dnaqublZGzduVENDgyRZVQOnT59u/bz00ksDKhma3n77bRUWFlqFKd58802VlpZq4cKF/R5nGMagJdx9Pp9VBOPmm28e9LPX1tbq2GOP1cMPP6yamhrNmjVrQDv6ts/n86m8vFyFhYWjKsseCAQGlKcHAKSHdEEAQEZFIpG0yn+Hw+G0Xu+xxx7TI488olWrVumb3/ymdfuuq1NSqsDDUO255ZZb9Itf/ELBYFCbNm3Sr371qwGP/X//7//p3nvv1R133KFzzjnHWk3a9TDivqtM77//vm677Ta1tLToqaee6pcWeNJJJ6m+vn5AAY5EIqFbb73V2gvVVzKZVCwW65dyGIvFVFpaKil1sPFll12mww8/XNddd92A1Mjnn39e9913X1oBUiKRGDJgBACMHUEWACCj/va3v6X1ODO1biSTJ0/WH/7wB33+85+39jCNxtKlS7V06VJJ6rc6lI6pU6fq4osv7nfbhRde2K8QxrRp0/TUU0+ptLRU55xzTr8zriQNWuEwEolowoQJmjRpUlrtOOKII7Rp0ybr9z322EPXX399vzPA7r//flVUVOj//u//NGnSpEH3nO2qu7vb2g8HAMgcnzHYVCAAAA5h7hEa7LwrAACciCALAAAAADKIaUEAAAAAyCCCLAAAAADIIIIsAAAAAMgggiwAAAAAyCBKuI8gmUzqo48+Unl5+agOcQQAAADgLYZhqL29XVOmTBm26i1B1gg++ugjTZs2ze5mAAAAAHCIDz74QLvvvvuQ9xNkjaC8vFxSqiMrKipsbo23xWIxrV69Wsccc4xCoZDdzfE8+jv36PPco89zi/7OPfo89+jz3HNSn7e1tWnatGlWjDAUgqwRmCmCFRUVBFlZFovFVFJSooqKCtv/AuUD+jv36PPco89zi/7OPfo89+jz3HNin4+0jYjCFwAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQAAAACQQQRZAAAAAJBBBFkAAAAAkEEEWQAAAACQQUG7GwBkUiJp6JX6Zn3S3q2J5UU6ZHq1An6f3c1ynETS0N/qm/Vao0819c069NMTbe8np/7ZObFdtCn9NvE9p01ebxPfcXe2yamc2FdO/J6nw9Ygq7GxUbNmzdJf/vIX7bXXXiM+/vnnn9f3vvc9NTQ06Morr9Sll15q3ff444/rsssuUywW07Jly3TGGWdY991555269tprVVpaqnvvvVdf/epXs/FxYLNnNmzX0qc3avvObuu2yROKtGT+DB2332QbW+Ys/fspoAf/8art/eTUPzsntos2jaVNfM9pk9fbxHfcTW1yKif2lRO/5+myLV2wsbFR8+bN09atW9N6fENDg0466SSdccYZWrt2rR566CH95S9/kSRt2LBBZ555pq6++mo9++yzWrx4sTZt2iRJevbZZ/WDH/xAv/zlL/Wb3/xGCxcuVFNTU7Y+FmzyzIbtOu83f+83MEjSjp3dOu83f9czG7bb1DJncWI/ObFNTm0XbaJNtIk20SZ3t8mpnNhXTmzTaPgMwzDseOOjjjpKJ510ki6++GLV19ePuJJ166236he/+IU2btwon8+nFStW6LHHHtNvfvMbff/739c777yjZ555RpJ02223qaGhQdddd51OPvlkTZo0Sffcc48k6ZJLLtG+++6rhQsXptXOtrY2TZgwQTt37lRFRcW4PjOGF4vFtHLlSp1wwgkKhUJpPy+RNPSVn/x5wF9Ck0/SpAlFevHyr7pieTlbRuonSSotDOibh+whvy83/ZQ0DD38t/fVGU04pk3ZbFcimdR7772nT33qUwr4RzfH5cS+ok20aVd8x2mTW9o0nmuDsV6vOJUbrw/svLZLNzawLciqr6/X9OnT5fP50gqyFixYoOLiYt11112SpO3bt+urX/2q3n77bc2dO1fHH3+8fvjDH0qS1q5dq2uvvVarVq3S9OnT9ZOf/ESnnXaaJOmRRx7RX//6V919992Dvk8kElEkErF+b2tr07Rp09TY2EiQlWWxWExr1qzR0UcfPapB62/1zfrWr14d8XG/+feD9aXp1eNpoqul208AAOSLsVwbjPV6xancfH1gx7VdW1ubamtrRwyybNuTNX369FE9vq2tTTNmzLB+r6io0EcffWTd1/f10r1vMDfeeKOWLl064PbVq1erpKRkVG3G2KxZs2ZUj3+t0ScpMOLjVr/wNzW9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gwiyAAAAACCDCLKQMytWrNCnPvUpBYNBHXjggXr77bdHfM5JJ50kn89n/Rx11FE5aCkweg888EC/76r588ADDwz7vJkzZ/Z7/MKFC3PTYGAUGhsbNX36dG3dutW6bSxjusS4Dmfa9Ts+1jFdYlxHCkEWcmLLli1asGCBbrrpJm3btk2f+cxn0hp0Xn31Vb355ptqaWlRS0uLVqxYkYPWesNFF13Ub5D/9Kc/PeJznn/+eX3+859XbW2tbr755hy00ju++c1vWt/TlpYWffDBB6qtrdVhhx025HPC4bC2bNmiTz75xHreHXfckcNWu9NgF/wbNmzQrFmzVFVVpUWLFindmk6PP/649txzT02ZMkWPPPJIllrsbo2NjZo3b16//h7rmC4xrqdrsO/5WMZ1ibF9JIN9x8cypkuM6+kaapLGU2O5AeTA008/bfziF7+wfv/zn/9sFBcXD/ucDz/80Jg0aVK2m+ZZhx56qPHHP/7RaGlpMVpaWoy2trZhH//JJ58YFRUVxtKlS413333XOOigg4w///nPOWqt91x//fXGd7/73WEf8+KLLxqzZ8/OUYu8oaGhwfjSl75kSDLq6+sNwzCM7u5uY6+99jLOPfdcY/PmzcYJJ5xg/OpXvxrxtd58802joKDA+O///m/jjTfeMD796U8b77zzTpY/gfsceeSRxm233davz8cyphsG43q6BvueG8box3XDYGxPx2Df8V2lM6YbBuN6OjZv3mxUVVUZv/3tb40dO3YY//Zv/2b8y7/8i+fGcoIs2OLuu+82Zs6cOexj/ud//seoq6szpk6dapSUlBinn3660dzcnKMWulssFjMqKiqM9vb2tJ9zyy23GJ/73OeMZDJpGIZhPPnkk8aZZ56ZrSZ6WldXlzFx4sQh/7E23Xzzzcbuu+9u1NbWGhMmTDC+973vGd3d3blppEsNdjH0xBNPGFVVVUZnZ6dhGIbx+uuvG1/+8pdHfK2LL77YOPbYY63fb731VuOqq67KSrvd7L333jMMwxj2AjSdMd0wGNfTNdj3fCzjumEwtqdjpO94umO6YTCup2OoSRqvjeWkCyLnotGoli1bpu9973vDPu6dd97RAQccoD/+8Y96+eWXVV9fryuuuCJHrXS3N998U8lkUgceeKCKi4t13HHH6f333x/2OevXr9fcuXPl8/kkSYcccohee+21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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化不同K值的准确率\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.plot(k_values, accuracies, marker='o', linestyle='-')\n",
    "plt.title('不同K值的准确率')\n",
    "plt.xlabel('K值')\n",
    "plt.ylabel('准确率')\n",
    "plt.grid(True)\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 5. 测试不同的距离度量方式\n",
    "\n",
    "使用找到的最优K值，我们将测试不同的距离度量方式对分类准确率的影响。"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 25,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "不同距离度量的准确率:\n",
      "euclidean: 1.0000\n",
      "manhattan: 1.0000\n",
      "chebyshev: 0.9556\n",
      "minkowski: 1.0000\n"
     ]
    }
   ],
   "source": [
    "# 使用最优K值测试不同的距离度量\n",
    "distance_metrics = ['euclidean', 'manhattan', 'chebyshev', 'minkowski']\n",
    "print(\"不同距离度量的准确率:\")\n",
    "metric_accuracies = []\n",
    "\n",
    "for metric in distance_metrics:\n",
    "    knn = MyKNN(k=best_k, distance_metric=metric)\n",
    "    knn.fit(X_train_scaled, y_train)\n",
    "    y_pred = knn.predict(X_test_scaled)\n",
    "    accuracy = accuracy_score(y_test, y_pred)\n",
    "    metric_accuracies.append(accuracy)\n",
    "    print(f\"{metric}: {accuracy:.4f}\")"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 26,
   "metadata": {},
   "outputs": [
    {
     "data": {
      "image/png": "iVBORw0KGgoAAAANSUhEUgAAA1kAAAIgCAYAAAB3W6OOAAAAOXRFWHRTb2Z0d2FyZQBNYXRwbG90bGliIHZlcnNpb24zLjcuNSwgaHR0cHM6Ly9tYXRwbG90bGliLm9yZy/xnp5ZAAAACXBIWXMAAA9hAAAPYQGoP6dpAABki0lEQVR4nO3deVxXVeL/8TebICoCrklguFRu5BKGpZJpLrmVOqlZqUWZ5uSkkpplYKaWiamZjUua5jKjk6OWS1ONaeaSDpKI4p57ubAp8uEj3N8f/rhfP7IIdfWD+Ho+HjzGe88995778cwn3p5zz3UxDMMQAAAAAMASrs5uAAAAAACUJIQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAAC7k7uwEAcCdLTk6WYRgqVaqU3NzcClUnMzNTrq6uKlu2rLmdnZ1dpOu6urqqVKlS5vaRI0eUlZXlcExQUJDOnTun9PT0XPVzrnfvvfcWeJ1Zs2apTJky6tOnT5Had62pU6dq27ZtWrx48R8+R1H9/vvvcnd3l7+/v8P+nM8jKCioSOf7+OOPderUKY0ZM0aLFi3Stm3b9Pe//10uLi5FbluvXr3UvHlzDR48uMh1P/zwQ9WrV08dOnQoct3C2LNnj+rVq3dTzn2906dPy9PTM9ffEQAUBy6GYRjObgQA3KmeffZZLVq0qMj1Ro8erXHjxkmSHn74YW3ZsqVI9du1a6d169aZ25UqVVKpUqVUunRpSdKhQ4e0d+9eDRkyRD/++KO5P8eVK1cUHBys2NhYSdLly5fl5eWVKzQMGDBA//nPf3T48GGH/dnZ2crMzJS7u7vc3d0dznu9hQsX6sUXX9Thw4d19913S5KysrKUkZGh0qVLO4RFSWrTpo327NmjKlWq5Hv/J06cUOfOnTVv3rw8yz/55BONGDFCZ86cUZkyZcz9ixYt0vPPP69ffvklzzCxY8cObd68WUOGDHHYHxISIn9/f23YsEFbtmzR448/ruHDhysqKirXOY4dO6aMjAzzvrKzs5Wdna1atWpp06ZNatmypTZu3KgWLVrke3/p6elyd3eXh4eHw99J69at5eLiom+//dbcZxiG7Ha77Ha7w70W1a5du9S2bVtt2bJFNWvW/MPnKazx48frP//5j7755ht5eHjc9OsBQFEwkgUATjR16lRNmjRJnp6ecnX9vxnc58+fV6NGjfTOO+/oxRdfdKhjt9sdgoWnp6e6d++uDz/8sFDX/Otf/ypvb2+HfZ6envriiy/06KOPSpJcXFxUqlQpeXp6atSoUXrrrbcKPGeDBg10+vRpubu75zk64+vra/4555f6zMxMLVq0SD179pQkbd26Vc2aNcv3GsHBwbn2rV27Vu3bt3fYV7p0aTVu3FiPP/54vudatmxZruB4rYSEBLVp0yZX6Fi/fr2aNWuW72jN0aNHNXz4cHl4eGjQoEGSpB9//FG7d+/Wl19+KUlq1qyZPv/8c91zzz0yDENXrlxRVlaWvLy8JEnR0dH65z//KZvNJunq302tWrW0detWvfrqqypdurQ6d+4sSUpJSVG/fv1yhcVBgwZp4cKF8vb2lqenp6SrwTRntLRixYrmsVeuXNHFixfVvHlzbdiwId/PpCDp6el66qmn9Mknn6hmzZrasGGDWrVqpdjYWDVs2FCS9N577+ntt9/W2rVr1a5du0KdNzMzUzNnztSWLVtUrlw59evXT4888ogkaeTIkdq2bZtGjx6tDz744A+1GwBuFkIWADhRhQoV8tz/xhtvqHLlynrttddu+K/0bm5uKlu2rAIDA5WVlZVr9CJHZmamPDw8VKZMGYfRI0nmL+LX8vDwcAh+BTl48KA5GuLq6qq33npLAQEBat++verUqaOVK1dq7NixGjx4sPr375/nOXLadPLkSfn4+OjcuXMaPHiwJk6cqHvuuUeS9PXXX2vu3LlatmyZbDabypcvn+e5vL29HYLE9XICzfXOnDmjixcvateuXXr88cd18OBBSVenTmZmZmrFihVq3769Pv30U4d2R0RESJJ69Oghm82mvn37qly5cnruuef0/vvvS5K6deuWb3v69OmjL774QpI0d+5czZ07V+Hh4XrkkUc0fvx4SVfDcWpqqn799VdVqlRJW7du1WOPPWaOaF5r9uzZGj9+vKpVq2buGzp0qGJjY/X111/Ly8vL4e/2xx9/1EMPPZRv+25k3Lhxat68uXr06JFn+c8//6yoqCgNHz680AHLMAw9+eSTOnDggP7yl7/ol19+UcuWLbV27Vq1bdtWrq6umjNnjurXr68XXnhB999//x9uPwBYjZAFAMXMN998ozlz5mjQoEFFmga1adMmtWrVqsBjjhw5kuf+rKws7dq1y2FfUZ/zmjNnjj755BPt2rVLvXr10rp169SmTRulp6crLS1N8+fP17PPPiu73S5vb29t3rxZTZs2Nevn/NLv6ekpDw8PlS5dWl9//bU++OAD8/kzm82mhIQE+fj4KDMzM8/n2Ox2u/73v//pwIED+bb11KlTeY6MDR06VEuWLJEkbd682ZzOl5CQoM2bN8tms+nIkSOaM2eOJCktLU2nT582Q5Z0NTAdO3ZMycnJ2rhxo7766itJUlJSkiRp7969evjhhxUXF6dq1aopMzMzV8i12+36+eef9fbbb0u6OmVy9uzZ+umnn1SpUiVJUlRUlAYMGKCAgIBc97Ft2za1adNGY8eOVWRkpDZs2KCFCxfq3//+tzIzM9W0aVO9+eab6tmzp0aMGKFp06bphx9+KHAkMT8ZGRn65JNPtGfPnjzLL126pD59+qhJkyZ67733Cn3eL7/8Utu3b9fevXvNe27Tpo1mzZqltm3bSro6zfX111/X1KlTNXPmzCK3HQBuGgMAUGwcO3bMqFKliuHu7m68+uqrRlpamtG+fXtj586d+dZp3bq10bdvXyM1NdWIi4szEhISjL179zr8JCQkGLt27TJsNpvRs2dPo0+fPg7n6N69u9G6dWvjrrvuMmrWrGm0bt3aOHbsmNG1a1dDUq6fatWq5WrHvHnzjIceesg4efKkER0dbTRs2NBo0KCBMXPmTKNLly6Gl5eX8corrxjnzp0z3NzcjN27dzvU37lzpyHJmD17dp7XzOtnyZIlZv2UlBTDbrcX6fO22+3GxYsXze1+/foZffv2NbePHz9uSDISExON+++/33j11Vcd6q9bt86oUKFCnudOTU017r33XsPHx8e49j+3u3fvNiQZR44cMa5cuWKkp6cbWVlZDnVXrVplVKhQwcjMzDQMwzAyMzONrVu3Gq6uroafn5/h5+dnSDIqVKhgVKhQwXB3dzcmTZrkcI7169cbDz74oPHZZ58ZXl5exlNPPWW88847RmhoqNGiRQvj3LlzxqeffmpUqVLF2LZtW5E+t2utXLnSaNWqlcO+//73v4YkIzY21njhhReM8uXLG4cPHzbL582bV+Dfq2EYxs8//2ysW7fO4bzPP/+80alTJ4d9R48eNapUqZLrMwQAZ2IkCwCKiXPnzqljx44KDQ01n8fx8vJSmTJl1KpVK61evVotW7bMt365cuUUEhLyh669fPlySVK/fv1Uq1Yth2ewRo8ereHDh5vbixcvLvD5r8qVK8swDMXExJgja6+88oq2bt2qbdu25bsaXM7IWc+ePfXss88qJSVFVatW1d69e82pYF988YXeeustHT58WHa73WEkq2LFiuZ0yHLlyt1w5b709HSlpqaqWbNm+s9//iPp6tTLvBbfmD17tk6fPq0xY8Y47Lfb7XlOtZSuLq7h4uKiUaNGadSoUbnac+1I2u7du1W/fn1z++OPP5aXl5c5tfKJJ57QM888o1KlSumXX36RJAUGBurcuXOSpObNm+daAKRt27Z6/PHHtXfvXjVr1kzBwcH6+OOPVbduXXPK4EsvvaQ2bdr8qYUqfvnlFz388MN5ln355Zf67LPPNHv2bIf77dKli7loSn4efPBBh+3ExEStXLlSMTExDvurV68ud3d3nTlzxmF6JAA4EyELAIqBY8eO6YknnlDZsmW1ePFi/eUvf5F09XmfJUuWqFu3bmrfvr1WrFhR4DMtx48fz3N58apVq+r06dN51snKylJaWlq+zzd5eXk5LFzh7e2d57Naly9f1rZt2244xfFvf/ubJOnixYsO+zMzMyVJZcqUkaurq5KTkyVdnZKX8+f09HRlZ2fL1dU1V7jJqT9v3jylpKQU2AZJCggIMD/na+UsBJFzPelq+OzWrZu5JP3rr79uXjOv57uOHj2qOnXqKDY2Vt99952k3NMFd+3apYCAAF2+fNlhJcTVq1frm2++UdeuXdW+fXvNnTtXu3fvvuH9XB+yLl26pEGDBuntt9/Wf/7zH0VERKhBgwZavXq1XnjhBQUEBKhv375q3769/v73v6tr1643vEZeTp8+rbp16+ZZlvM82c6dOx2mVPr7+xd66fULFy7oueee0/fff68XX3wxz2f67rrrLp06dYqQBaDY4GXEAOBkGzZsUNOmTeXn56f169erXLlyDuUeHh5atmyZwsLC9OSTT+qbb77J91w5wWP79u1KSkpSUlKS5s6dm2+Akq6OEPj5+ZmjIv/+97/Vr18/jR07tkj3MXDgQBmGYf6kpqaqfv36+vzzzx325/yEhYU51L98+bLKlStnBriMjAxJMj8bPz8/DRgwwBzly8/777+vxMRE3XPPPbrnnnvk5eWl119/XUFBQea+TZs26e9//3ue9RctWqRy5cqpXLlyuu+++yRdDX7NmjWTl5eX3nvvPV26dElS/iGrV69emjRpksMKhr6+vvL19TX/fsuXL6+KFSsqMDDQDEiHDx/Wiy++KG9vb9WvX1/PPvusatas6bBCYL169czVDXPOuXXrVofrr1ixQiEhITpz5oz279+v8PBwrV+/Xh07dtTEiRN18uRJTZ06VUlJSXrjjTfUo0cPjRo1qsDPNT+urq75Pr9Xs2ZNDRw4UJ999pl+/fVXc7/x/1dVzO/nWl5eXnrsscd077336ssvv1RCQkKu61y7ciIAFAeELABwkitXruivf/2rWrdurbZt2+rbb78tcDTp3//+t+6//3499dRTOnXqVJ7H5UxJK1eunPkLuLe3d4G/gOYs554TCFJSUnT8+HH99ttvkq6+MPno0aPmz7lz53L9Uj1nzhzznVc5P76+voqPj9cLL7yQqyzn59rAlDM9ULq6MEWZMmXMoHjtT2JiYoEjVaVKldK//vUvDR8+XMOHD9eECRMkXV2xMWff999/n2uFxRy9evXS2bNndfbsWXNqXo6XX35ZGRkZ5sIXGRkZuULWsWPHtH37djVq1Mhhf3JyspKTk5WWliZJSk1N1fnz53X69GnZ7XZJV6dajho1Sr17987VruzsbNntdu3Zs8dcZCLnnNcGVsMwNHfuXPXp00fr1q3TXXfdJUnq3r27/v73v+vnn3/W0KFD9cQTT2jdunUaOnSouWriH5EzipSXadOmKSoqSu7u7g6rIH7++efy8PDI9+da3t7eGjZsmHbu3KmAgABzJPRap0+fNu8TAIoDpgsCgJO4u7srODhYc+bMyXdZ82v5+Pjoq6++0qZNm/KdFpWVlSUp9xS7nF/iC6Nv377mM1lPPvmkJk+erMmTJzscc/31S5Uqpfr165srFB44cECNGjXS6tWrzeey/vWvf6lt27YqV66cDh48qNq1a8swDPMc1/6iXK9ePdlsNl2+fDlX8ExJSdGzzz6rhQsX5tn+jIwMtWzZ0gwe58+f18SJE/Xyyy+bo2Rr1qzJ89kr6epoYM7y7zmjaTl8fHz09NNPa8mSJRoyZIjS09NzvXNszpw5CgwM1GOPPeawP2cZ+pyAmvO+J5vNptjYWNWrV09ly5bV66+/rldeeSVXu3LCWb9+/cx9nTp1kiSH0R273a4lS5aodOnScnFxUaNGjfTjjz9Kktq3b69atWqpe/fu6tatmxnKO3XqZL677PpphzfSpEkTRUdH51lWpUoVVa5cWQMHDtTUqVP15ptvKjg4uFDPZCUnJ+vKlSvm34W7u7ueeOIJzZ071+G4xMREubu7F/jyaQC41QhZAOBEQ4cOLdLxAQEB6tWrV77lOSND1y6NLulP/QL67rvv3vBlxNc+o5WSkqKePXuqW7duZsDKysrSqFGjtH79es2aNSvPcyQmJprhLSkpSenp6QoJCdGbb76pF154QZL0wQcf6OOPP9bUqVPzbUtMTIzD8145IyN333232c6XX37ZXBa8qN566y3z/WYXL16Uj4+PWZaWlqZPPvlEr776aq7n1nJCb3x8vBo0aKDdu3ebwSsv7733nrnk+TvvvGM+U7dy5UolJSUpMDDQXB6+efPmZr2YmJgCp/6tX79eM2bMyLNsxIgRmjhxYr518/LYY4+pT58+OnjwoGrVqpXnMW+88YZmzpypsWPHat68eYV6Jmvo0KE6c+aM1qxZY+47cOBArs/siy++UI8ePW640AkA3EqELAAohnJGpIoqMDBQZ8+ezbW/sC8Vzs7OVnx8vGJiYv5wGwYPHqzY2Fg1adJEL774ok6ePKnjx4/rxIkTmjNnjl544YU8XxT8ww8/qG/fvua2t7e35s2bp06dOikwMFAXL17Ue++9p2+//TbfX9BXrVqlAQMGyNvb2/ylO2cU79qVAa9cuaLLly8rNjY216jcxYsXdfToUUlXX058vRo1aph/TkpKcghZOc85vfjiizf6mCRdndqXlZWlzMxMc+Qpx+jRozVu3DhFRETIbrdr586duu+++8xplPl5/fXX9dprr6lUqVK5pkTmjGR9/PHHudpht9sdRhYLy8PDQ5GRkXr99de1evXqPI/JGc366KOPNHr06HzD2LVeffVVPfzww3r55Zf1zDPPaMuWLVq2bJmWLl1qHvPrr7/q73//u3bs2FHkdgPAzUTIAoBiyGaz5TudrSCurq55BphrZWVlmb98Z2VladKkSZKkunXr6ty5c2rUqJEqVaqktm3bauPGjTp37pz27dvncI7s7GxlZGSoTp06Kl26tMMv5yEhIfLx8dHhw4fVsGFDNWvWTPfee69q1aqlkSNHym6353qm6/Dhw9q9e3eulym3aNFCEydOVOfOnZWVlaV//OMfCg0Nzffe2rRpo19+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AADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACzktJAVHx+v0NBQ+fn5KTIyUoZhFHi8YRgaOHCg/P395evrq379+uny5ctmeXR0tPz9/eXp6amnnnpKaWlpZllISIhcXFzMn4iIiJt2XwAAAADubE4JWTabTZ07d1aTJk20Y8cOJSQkaP78+QXWWbhwoRITExUbG6tNmzZpz549mjBhgiRp0aJFWrRokdatW6c9e/Zo7969mjhxoiQpPT1dhw4d0u+//66kpCQlJSVp+vTpN/sWAQAAANyh3J1x0bVr1yolJUUxMTHy9vbW+PHj9eqrr6p///751tm+fbt69Oih6tWrS5KefPJJ7dmzR5J0/Phxff7552ratKkkqWfPnvr5558lSbGxsQoJCVGlSpVu8l0BAAAAgJNCVlxcnMLCwuTt7S3p6nS+hISEAuvUq1dPCxcuVPfu3ZWRkaGlS5dq6NChkqSRI0c6HJuYmKjatWtLuhrOTpw4oUqVKslut6t379766KOP5Onpmed1bDabbDabuZ2amipJstvtstvtf+yGLeTpVvC0SqAoikOfvh59HFajn6Oko4/jTlBc+nlh2+Fi3OhhqJtg2LBhysjI0IwZM8x9lSpV0v79++Xn55dnHbvdriZNmmj37t2SpM6dO+vf//63XF0dZzzu379fDRo00P/+9z/Vq1dPr7zyilJSUhQVFaXk5GT16dNHERERuYJZjqioKEVHR+fav3jxYjMUAgAAALjzpKen65lnnlFKSop8fHzyPc4pIWvEiBGy2+2KiYkx9wUGBmrr1q0KCAjIs86HH36oVatW6YsvvpCLi4sGDBigOnXqaPLkyeYx2dnZatmypR544AGHAHetBQsWaNq0adqxY0ee5XmNZAUGBurcuXMFfpC3Sv2o9c5uAkqQ+Kh2zm5CLvRxWI1+jpKOPo47QXHp56mpqapYseINQ5ZTpgv6+/srPj7eYV9aWppKlSqVb51FixZp7NixCgoKkiRNmDBB4eHhDiHr3Xff1YULFzRp0qR8z1O5cmWdPHky33JPT888pxJ6eHjIw8Mj33q3ii3LxdlNQAlSHPr09ejjsBr9HCUdfRx3guLSzwvbDqesLhgaGqotW7aY20eOHJHNZpO/v3++dbKzs/X777+b22fOnFFWVpa5vXr1asXExOhf//qXw7S+Zs2a6fjx4+b2li1bzMUzAAAAAMBqThnJatmypVJTUzVv3jz1799f48ePV5s2beTm5qbk5GSVK1dObm5uDnVatGihiRMnys3NTZmZmXr//ffVpUsXSdLevXvVu3dvffLJJwoMDNTFixfl6uoqb29v1atXTwMGDNA777yjffv2afLkyflOJQQAAACAP8spIcvd3V1z5sxR7969FRkZKVdXV23YsEGS5Ofnp9jYWDVs2NChzrhx45Samqo33nhDaWlpateunaZOnSpJmjVrli5duqS+ffuqb9++kqTq1avr6NGj+vDDD9W/f3+1atVKlStX1qRJk8xjAAAAAMBqTglZktSlSxcdOnRIO3fuVFhYmCpUqCBJym8dDl9fXy1YsCDPsilTpmjKlCn51luxYoU1jQYAAACAG3BayJKkqlWrqmPHjs5sAgAAAABYyikLXwAAAABASUXIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAsRsgAAAADAQoQsAAAAALAQIQsAAAAALETIAgAAAAALEbIAAAAAwEKELAAAAACwECELAAAAACxEyAIAAAAACxGyAAAAAMBChCwAAAAAsBAhCwAAAAAsRMgCAAAAAAs5LWTFx8crNDRUfn5+ioyMlGEYBR5vGIYGDhwof39/+fr6ql+/frp8+bJZvnz5clWvXl3VqlXTkiVLHOrOmDFDVapUUY0aNfT999/flPsBAAAAAMlJIctms6lz585q0qSJduzYoYSEBM2f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",
      "text/plain": [
       "<Figure size 1000x600 with 1 Axes>"
      ]
     },
     "metadata": {},
     "output_type": "display_data"
    }
   ],
   "source": [
    "# 可视化不同距离度量的准确率\n",
    "plt.figure(figsize=(10, 6))\n",
    "plt.bar(distance_metrics, metric_accuracies)\n",
    "plt.title(f'不同距离度量的准确率 (K={best_k})')\n",
    "plt.xlabel('距离度量')\n",
    "plt.ylabel('准确率')\n",
    "plt.ylim(0.8, 1.0)  # 设置y轴范围，更好地显示差异\n",
    "plt.grid(True, axis='y')\n",
    "plt.show()"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 6. 与sklearn的KNN进行对比"
   ]
  },
  {
   "cell_type": "code",
   "execution_count": 27,
   "metadata": {},
   "outputs": [
    {
     "name": "stdout",
     "output_type": "stream",
     "text": [
      "Scikit-learn KNN的准确率:\n",
      "准确率: 1.0000\n",
      "\n",
      "比较:\n",
      "自定义KNN (欧式距离): 1.0000\n",
      "Sklearn KNN: 1.0000\n"
     ]
    }
   ],
   "source": [
    "# 与sklearn的KNN进行对比\n",
    "print(\"Scikit-learn KNN的准确率:\")\n",
    "sklearn_knn = KNeighborsClassifier(n_neighbors=best_k)\n",
    "sklearn_knn.fit(X_train_scaled, y_train)\n",
    "sklearn_pred = sklearn_knn.predict(X_test_scaled)\n",
    "sklearn_accuracy = accuracy_score(y_test, sklearn_pred)\n",
    "print(f\"准确率: {sklearn_accuracy:.4f}\")\n",
    "\n",
    "# 比较自定义KNN和sklearn KNN的准确率\n",
    "print(\"\\n比较:\")\n",
    "print(f\"自定义KNN (欧式距离): {best_accuracy:.4f}\")\n",
    "print(f\"Sklearn KNN: {sklearn_accuracy:.4f}\")"
   ]
  },
  {
   "cell_type": "markdown",
   "metadata": {},
   "source": [
    "## 7. 结论\n",
    "\n",
    "1. 成功实现了基于欧式距离的KNN算法，并达到了90%以上的分类准确率。\n",
    "2. 通过实验找到了最优的K值。\n",
    "3. 测试了不同的距离度量公式，包括欧式距离、曼哈顿距离、切比雪夫距离和闵可夫斯基距离。\n",
    "4. 将我实现与sklearn的KNN实现进行了对比，结果相近。\n",
    "\n",
    "通过本次实验，深入理解了KNN算法的原理和实现，以及不同参数和距离度量方式对分类性能的影响。"
   ]
  }
 ],
 "metadata": {
  "kernelspec": {
   "display_name": "env0",
   "language": "python",
   "name": "python3"
  },
  "language_info": {
   "codemirror_mode": {
    "name": "ipython",
    "version": 3
   },
   "file_extension": ".py",
   "mimetype": "text/x-python",
   "name": "python",
   "nbconvert_exporter": "python",
   "pygments_lexer": "ipython3",
   "version": "3.8.20"
  }
 },
 "nbformat": 4,
 "nbformat_minor": 4
}
